<?php
/**
 *+------------------
 * Lflow
 *+------------------
 * Copyright (c) 2023~2030 gitee.com/liu_guan_qing All rights reserved.本版权不可删除，侵权必究
 *+------------------
 * Author: Mr.April(405784684@qq.com)
 *+------------------
 */
declare (strict_types=1);

namespace lflow;

use lflow\entity\Order;
use lflow\model\TaskModel;
use lflow\workflow\Execution;

/**
 * 流程引擎接口
 *
 * @author Mr.April
 * @since  1.0
 */
interface WorkFlowEngineAlias
{
    const ADMIN = "lflow.admin";
    const AUTO = "lflow.auto";
    const ID = "lflow.orderNo";

    /**
     * process  获取process服务
     * Date  2023/3/29 15:49
     *
     * @return \lflow\IProcessService
     */
    public function process(): IProcessService;

    /**
     * query  获取查询服务
     * Date  2023/3/29 15:49
     *
     * @return \lflow\IQueryService
     */
    public function query(): IQueryService;

    /**
     * order  获取实例服务
     * Date  2023/3/29 15:50
     *
     * @return \lflow\IOrderService
     */
    public function order(): IOrderService;

    /**
     * task  获取任务服务
     * Date  2023/3/29 15:50
     *
     * @return \lflow\ITaskService
     */
    public function task(): ITaskService;

    /**
     * manager  获取管理服务
     * Date  2023/3/29 15:50
     *
     * @return \lflow\IManagerService
     */
    public function manager(): IManagerService;

    /**
     * startInstanceById  根据流程定义ID启动流程实例
     * Date  2023/3/29 16:13
     *
     * @param string $id
     * @param string $operator
     * @param string $args
     *
     * @return \lflow\access\orm\model\Order
     */
    public function startInstanceById(string $id, string $operator, string $args): Order;

    /**
     * startInstanceByName  根据流程名称、版本号、操作人、参数列表启动流程实例
     * Date  2023/3/29 15:51
     *
     * @param string $name     流程定义名称
     * @param int    $version  版本号
     * @param string $operator 操作人
     * @param string $args     参数列表
     *
     * @return \lflow\Order
     */
    public function startInstanceByName(string $name, int $version, string $operator, string $args): Order;

    /**
     * startInstanceByExecution  根据父执行对象启动子流程实例
     * Date  2023/3/29 15:52
     *
     * @param \lflow\workflow\Execution $execution
     *
     * @return \lflow\Order
     */
    public function startInstanceByExecution(Execution $execution): Order;

    /**
     * executeTask  根据任务主键ID执行任务
     * Date  2023/3/29 15:52
     *
     * @param string $taskId 任务主键ID
     * @param string $operator
     * @param string $args
     */
    public function executeTask(string $taskId, string $operator, string $args): void;

    /**
     * executeAndJumpTask  根据任务主键ID，操作人ID，参数列表执行任务，并且根据nodeName跳转到任意节点
     * 1、nodeName为null时，则跳转至上一步处理
     * 2、nodeName不为null时，则任意跳转，即动态创建转移
     * Date  2023/3/29 15:52
     *
     * @param string $taskId   任务主键id
     * @param string $operator 操作人主键id
     * @param string $args     参数列表
     * @param string $nodeName 跳转的节点名称
     *
     * @return array
     */
    public function executeAndJumpTask(string $taskId, string $operator, string $args, string $nodeName): array;

    /**
     * createFreeTask  根据流程实例ID，操作人ID，参数列表按照节点模型model创建新的自由任务
     * Date  2023/3/29 15:54
     *
     * @param string                 $orderId  流程实例id
     * @param string                 $operator 操作人id
     * @param string                 $args     参数列表
     * @param \lflow\model\TaskModel $model    节点模型
     *
     * @return array
     */
    public function createFreeTask(string $orderId, string $operator, string $args, TaskModel $model): array;

}